package entity.Encomienda;

import java.sql.Time;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

import dto.Encomienda.DTO_Encomienda;
import dto.Encomienda.DTO_EncomiendaEmpresa;
import dto.Encomienda.DTO_ProductoClienteEncomienda;
import entity.Cliente.Entity_Cliente;
import entity.Cliente.Entity_DireccionEntrega;

@Entity
@Table(name="Encomienda")
@DiscriminatorValue(value="EM")
public class Entity_EncomiendaEmpresa extends Entity_Encomienda {
	@ManyToOne
	@JoinColumn(name="idCliente")
	private Entity_Cliente cliente;
	@ManyToOne
	@JoinColumn(name="idDireccionEntrega")
	private Entity_DireccionEntrega direccionEntrega;
	private boolean aRetirar;
	private String lugarRetiro;
	private Date fechaRetiro;
	private Time horaMinima;
	private Time horaMaxima;
	
	//Con Logistica
	@OneToMany(mappedBy="productoCliente")
	@LazyCollection(LazyCollectionOption.FALSE)
	private List<Entity_ProductoClienteEncomienda> productos;
	
	//Sin Logistica
	@OneToOne(mappedBy = "encomienda", cascade = CascadeType.ALL)
	private Entity_Manifiesto manifiesto;
	
	//A Granel
	private float volumenGranel;
	private String unidadGranel;
	private String cargaGranel;
	
	public Entity_EncomiendaEmpresa() {
		
	}
	public Entity_Cliente getCliente() {
		return cliente;
	}
	public void setCliente(Entity_Cliente cliente) {
		this.cliente = cliente;
	}
	public Entity_DireccionEntrega getDireccionEntrega() {
		return direccionEntrega;
	}
	public void setDireccionEntrega(Entity_DireccionEntrega direccionEntrega) {
		this.direccionEntrega = direccionEntrega;
	}
	public boolean isaRetirar() {
		return aRetirar;
	}
	public void setaRetirar(boolean aRetirar) {
		this.aRetirar = aRetirar;
	}
	public String getLugarRetiro() {
		return lugarRetiro;
	}
	public void setLugarRetiro(String lugarRetiro) {
		this.lugarRetiro = lugarRetiro;
	}
	public Date getFechaRetiro() {
		return fechaRetiro;
	}
	public void setFechaRetiro(Date fechaRetiro) {
		this.fechaRetiro = fechaRetiro;
	}
	public Time getHoraMinima() {
		return horaMinima;
	}
	public void setHoraMinima(Time horaMinima) {
		this.horaMinima = horaMinima;
	}
	public Time getHoraMaxima() {
		return horaMaxima;
	}
	public void setHoraMaxima(Time horaMaxima) {
		this.horaMaxima = horaMaxima;
	}
	public List<Entity_ProductoClienteEncomienda> getProductos() {
		return productos;
	}
	public void setProductos(List<Entity_ProductoClienteEncomienda> productos) {
		this.productos = productos;
	}
	public Entity_Manifiesto getManifiesto() {
		return manifiesto;
	}
	public void setManifiesto(Entity_Manifiesto manifiesto) {
		this.manifiesto = manifiesto;
	}
	public float getVolumenGranel() {
		return volumenGranel;
	}
	public void setVolumenGranel(float volumenGranel) {
		this.volumenGranel = volumenGranel;
	}
	public String getUnidadGranel() {
		return unidadGranel;
	}
	public void setUnidadGranel(String unidadGranel) {
		this.unidadGranel = unidadGranel;
	}
	public String getCargaGranel() {
		return cargaGranel;
	}
	public void setCargaGranel(String cargaGranel) {
		this.cargaGranel = cargaGranel;
	}

	public DTO_Encomienda  toDTO(){
		DTO_Encomienda e = new DTO_EncomiendaEmpresa();

		e.setId(this.getId());
		e.setIdSucursalOrigen(this.getSucursalOrigen().getId());
		if(this.getDestino()!=null)
			e.setIdDestino(this.getDestino().getId());
		
		e.setIdSucursalActual(this.getSucursalActual().getId());
		
		e.setFechaRecepcion(this.getFechaRecepcion());
		
		if(this.getFechaMaxima()!=null)
			e.setFechaMaxima(this.getFechaMaxima());
		e.setEstado(this.getEstado());
		
		if(this.getAseguradora()!=null)
			e.setIdAseguradora(this.getAseguradora().getId());
		
		e.setLargo(this.getLargo());
		e.setAlto(this.getAlto());
		e.setAncho(this.getAncho());
		e.setPeso(this.getPeso());
		e.setVolumen(this.getVolumen());
		e.setTratamiento(this.getTratamiento());
		e.setApilable(this.isApilable());
		e.setCantApilable(this.getCantApilable());
		e.setRefrigerado(this.isRefrigerado());
		e.setCondicionTransporte(this.getCondicionTransporte());
		e.setIndicacionesManipulacion(this.getIndicacionesManipulacion());
		e.setFragilidad(this.getFragilidad());
		e.setTercerizado(this.isTercerizado());
		e.setKilometrosRecorridos(this.getKilometrosRecorridos());
		e.setFacturado(this.isFacturado());
		e.setValorEstimado(this.getValorEstimado());
		e.setDistanciaEstimadaKM(this.getDistanciaEstimadaKM());
		
		if(this.getFactura()!=null)
			e.setIdFacturaCliente(this.getFactura().getId());
		
		if(this.getCliente()!=null)
			((DTO_EncomiendaEmpresa) e).setIdCliente(this.getCliente().getId());
		
		if(this.getDireccionEntrega()!=null)
			((DTO_EncomiendaEmpresa) e).setIdDireccionEntrega(this.getDireccionEntrega().getId());
		
		((DTO_EncomiendaEmpresa) e).setaRetirar(this.isaRetirar());
		((DTO_EncomiendaEmpresa) e).setLugarRetiro(this.getLugarRetiro());
		((DTO_EncomiendaEmpresa) e).setFechaRetiro(this.getFechaRetiro());
		((DTO_EncomiendaEmpresa) e).setHoraMinima(this.getHoraMinima());
		((DTO_EncomiendaEmpresa) e).setHoraMaxima(this.getHoraMaxima());
		
		List<DTO_ProductoClienteEncomienda> productos = new ArrayList<DTO_ProductoClienteEncomienda>();
		for(Entity_ProductoClienteEncomienda p : this.getProductos())
			productos.add(p.toDTO());
		
		((DTO_EncomiendaEmpresa) e).setProductos(productos);
		if(this.getManifiesto()!=null)
			((DTO_EncomiendaEmpresa) e).setManifiesto(this.getManifiesto().toDTO());
		
		((DTO_EncomiendaEmpresa) e).setVolumenGranel(this.getVolumenGranel());
		((DTO_EncomiendaEmpresa) e).setUnidadGranel(this.getUnidadGranel());
		((DTO_EncomiendaEmpresa) e).setCargaGranel(this.getCargaGranel());

		return e;
	}
}
